package org2.jogo.activities;

import org2.jogo.models.Pergunta;
import org2.jogo.models.SetPerguntas;
import org2.jogo.Global;
import org2.jogo.R;
import org2.jogo.Sound;
import org2.jogo.Utils;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

public class ExibePerguntaActivity extends GameActivity {
    /** Called when the activity is first created. */

    private CountDownTimer cronometro;
    private boolean jogoPausado = false;
    private int perguntaAtual = 1;
    private float tempoRestante;
    private final int SOM_TEMPO_ACABANDO = 0;
    private final int SOM_TEMPO_ESGOTADO = 1;
    private final int SOM_PASSOU_PERGUNTA = 2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Button btnConfirmar = (Button) findViewById(R.id.btnConfirmar);
        TextView countdown = (TextView) findViewById(R.id.txtCronometro);
        countdown.setTextColor(getResources().getColor(R.color.verde_cronometro));
        btnConfirmar.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                Sound.pararSom(SOM_TEMPO_ACABANDO);
                avaliaResposta(true);
            }
        });
        SetPerguntas jogo = Global.getJogo();
        if (jogo.jogoTerminou()) {
            Intent i = new Intent(this, ResultadoJogoActivity.class);
            startActivity(i);
        }
        exibePergunta(Global.getJogo().getProximaPergunta());
    }

    @Override
    public void onBackPressed() {
        return;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        boolean result = super.onCreateOptionsMenu(menu);
        menu.add(0, 1, 0, "Pausar Jogo");
        menu.add(0, 2, 0, "Ir para o Menu");
        return result;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case 1:
            pausarJogo(true);
            return true;

        case 2:
            irParaMenu();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void pausarJogo(boolean exibeDialogo) {
        cronometro.cancel();
        cronometro = null;
        jogoPausado = true;
        Sound.pausarTodosOsSons();
        if (exibeDialogo) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Jogo pausado. Pressione \"Continuar\" para continuar o jogo.").setCancelable(false);
            builder.setPositiveButton("Continuar", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    continuarJogo();
                }
            });
            AlertDialog alert = builder.create();
            alert.show();
        }
    }

    public void continuarJogo() {
        if (jogoPausado) {
            iniciaCronometro();
            Sound.continuarTodosOsSons();
        }
    }

    public void irParaMenu() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Tem certeza de que deseja cancelar o jogo e ir para o menu?").setCancelable(false);
        builder.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                cronometro.cancel();
                Sound.pararSom(SOM_TEMPO_ACABANDO);
                startActivity(new Intent(ExibePerguntaActivity.this, MainActivity.class));
            }
        });
        builder.setNegativeButton("Não", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
    }

    public void incrementaLabelPerguntaAtual() {
        TextView lblTitleCount = (TextView) findViewById(R.id.labelTitleSupport);
        SetPerguntas jogo = Global.getJogo();
        int numeroPerguntas = jogo.numeroPerguntas();
        lblTitleCount.setText("Pergunta: " + perguntaAtual++ + "/" + numeroPerguntas);
    }

    /**
     * Inicia um novo cronômetro, com o tempo limite igual ao tempo restante da pergunta.
     */
    public CountDownTimer iniciaCronometro() {
        final SetPerguntas jogo = Global.getJogo();
        cronometro = new CountDownTimer((int) tempoRestante * 1000, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                TextView countdown = (TextView) findViewById(R.id.txtCronometro);
                countdown.setText(millisUntilFinished / 1000 + "");
                tempoRestante = (float) (millisUntilFinished / 1000.0);
                if ((int) tempoRestante == jogo.getTempoTolerancia()) {
                    countdown.setTextColor(getResources().getColor(R.color.amarelo_cronometro));
                }
                if ((int) tempoRestante == jogo.getTempoTolerancia() / 2) {
                    countdown.setTextColor(getResources().getColor(R.color.vermelho_cronometro));
                    Sound.iniciaSom(ExibePerguntaActivity.this, R.raw.sound_tempo_acabando, SOM_TEMPO_ACABANDO, true);
                }
            }

            @Override
            public void onFinish() {
                Sound.iniciaSom(ExibePerguntaActivity.this, R.raw.sound_tempo_acabou, SOM_TEMPO_ESGOTADO, false);
                Sound.pararSom(SOM_TEMPO_ACABANDO);
                avaliaResposta(false);
                TextView countdown = (TextView) findViewById(R.id.txtCronometro);
                countdown.setTextColor(getResources().getColor(R.color.verde_cronometro));
            }
        };
        cronometro.start();
        return cronometro;
    }

    public void exibePergunta(Pergunta pergunta) {
        final SetPerguntas jogo = Global.getJogo();
        tempoRestante = jogo.getTempoLimite();
        TextView descricao = (TextView) findViewById(R.id.descricao);
        descricao.setText(pergunta.getDescricao());
        RadioGroup alternativas = (RadioGroup) findViewById(R.id.radioAlternativas);
        for (int i = 0; i < 4; i++) {
            RadioButton alternativa = (RadioButton) alternativas.getChildAt(i);
            alternativa.setText(pergunta.getRespostas()[i]);
        }
        iniciaCronometro();
        incrementaLabelPerguntaAtual();
    }

    /**
     * Avalia a resposta do jogador, quando ele clica no botão de resposta ou o tempo acaba.
     * 
     * @param checarInput True se o jogador clica no botão de resposta, validando se ele marcou alguma alternativa, e
     *        false se o tempo acabou, não importando se ele marcou ou não, vai ficar com 0 mesmo
     */
    public void avaliaResposta(boolean checarInput) {
        RadioGroup alternativas = (RadioGroup) findViewById(R.id.radioAlternativas);
        int respostaMarcada = getAlternativaMarcada(alternativas);
        if (respostaMarcada >= 0 || !checarInput) {
            Sound.pararSom(SOM_TEMPO_ACABANDO);
            cronometro.cancel();
            SetPerguntas jogo = Global.getJogo();
            float tempoResposta = jogo.getTempoLimite() - tempoRestante;
            if (jogo.temMaisPerguntas()) {
                // Passa para a próxima pergunta, se tiver mais
                alternativas.clearCheck();
                if (checarInput)
                    Sound.iniciaSom(ExibePerguntaActivity.this, R.raw.sound_passou_pergunta, SOM_PASSOU_PERGUNTA, false);
                Global.getJogo().respondeProximaPergunta(respostaMarcada, tempoResposta);
                exibePergunta(Global.getJogo().getProximaPergunta());
            } else {
                // Termina o jogo, exibindo a tela de resultado
                Global.getJogo().getProximaPergunta().setResposta(respostaMarcada, tempoResposta);
                Sound.tocarSom(this, R.raw.sound_jogo_acabou);
                Intent i = new Intent(this, ResultadoJogoActivity.class);
                startActivity(i);
            }
        } else {
            Utils.showToast(this, "Escolha uma alternativa antes!");
        }
    }

    /**
     * Pega a alternativa que o jogador marcou, aparentemente o RadoiGroup não tem esse método por padrão, wtf
     * 
     * @param alternativas O RadioGroup em questão
     * @return O índice da alternativa marcada pelo jogador, ou -1 se ele não marcou nada
     */
    public int getAlternativaMarcada(RadioGroup alternativas) {
        int marcada = -1;
        for (int i = 0; i < 4; i++) {
            if (((RadioButton) alternativas.getChildAt(i)).isChecked())
                marcada = i;
        }
        return marcada;
    }

    @Override
    protected int getContentView() {
        return R.layout.exibe_pergunta;
    }

    @Override
    protected int getMusicaFundo() {
        return R.raw.music_bg_pergunta;
    }

    @Override
    protected String getTitulo() {
        return "Jogando";
    }
}